﻿using System;

namespace YPF.Common.Guid
{
    public class IdGenerate
    {
        /// <summary>
        /// 生成有序的，便于建立索引的Guid
        /// </summary>
        /// <returns></returns>
        public static System.Guid GenerateComb()
        {
            byte[] guidArray = System.Guid.NewGuid().ToByteArray();
            
            DateTime baseDate = new DateTime(1900, 1, 1);
            DateTime now = DateTime.Now;

            // Get the days and milliseconds which will be used to build   
            //the byte string   
            TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
            TimeSpan msecs = now.TimeOfDay;

            // Convert to a byte array       
            // Note that SQL Server is accurate to 1/300th of a   
            // millisecond so we divide by 3.333333   
            byte[] daysArray = BitConverter.GetBytes(days.Days);
            byte[] msecsArray = BitConverter.GetBytes((long)
                (msecs.TotalMilliseconds / 3.333333));

            // Reverse the bytes to match SQL Servers ordering   
            Array.Reverse(daysArray);
            Array.Reverse(msecsArray);

            // Copy the bytes into the guid   
            Array.Copy(daysArray, daysArray.Length - 2, guidArray,
                guidArray.Length - 6, 2);
            Array.Copy(msecsArray, msecsArray.Length - 4, guidArray,
                guidArray.Length - 4, 4);

            return new System.Guid(guidArray);
        }
    }
}

//参考文献：http://www.cnblogs.com/CameronWu/p/guids-as-fast-primary-keys-under-multiple-database.html